package com.airlines.crewassignment.service.linkline;

import java.util.Date;
import java.util.List;

import com.airlines.base.config.response.ResponseResult;
import com.airlines.crewassignment.domain.Crew;
import com.airlines.crewassignment.domain.LinkLine;
import com.airlines.crewassignment.domain.Position;

/**
 * @author xxxx
 * @date 2018年3月28日 
 * @description
 */
public interface PositionService {
	/**
	 * 暂时废弃
	 * 构造飞行员所需号位
	 * @return
	 */
	@Deprecated
	Position getPositionPilotBuilder(String acType,Integer serialNo,String rankNo);
	
	/**暂时废弃
	 * 
	 * 
	 * 根据连线信息计算所需要的飞行员号位列表
	 *  //规则1： 
		//如果连线飞行时间<=8小时，则配备机长+副驾
		//如果连线 8小时<飞行时间<=9小时，则配备机长+第一副驾+第二副驾
		//如果连线 9小时<飞行时间<=13小时，则配备 第一机长+第二机长+副驾
		//如果连线 13小时<飞行时间<=17小时，则配备 第一机长+第二机长 + 第一副驾 + 第二副驾
		//如果连线  17小时<飞行时间 ，则不允许分配，这是不允许的
	 * @param linkLine
	 * @return
	 */
	@Deprecated
	List<Position> listPositionPilot(LinkLine linkLine);
	
	/**
	 * 将某一天排班的用户编号全部置为null
	 * @param flightDate
	 */
	void updatePcodeNull(Date flightDate,String dutyCode);
	
	void updatePcode(Position position,Crew crew);
	
	/**
	 * 获取号位主键
	 * @param p
	 * @return
	 */
	String positionKeyInit(Position p);
	
	Position getByPrimaryKey(int positionId);
	
	int saveOrUpdate(Position position);
	
	/**
	 * 删除某个号位
	 * @param positionId
	 * @return
	 */
	int deleteByPrimaryKey(int positionId);
	
	/**
	 * 删除某一天的某个部门的所有号位
	 * @param flightDate
	 * @param dutyCode
	 * @return
	 */
	int deleteByFlightDate(Date flightDate,Integer crewLinkLineNo, String dutyCode);
	
	/**
	 * 多条件组合查询号位信息
	 * @param position
	 * @return
	 */
	List<Position> listPosition(Position position);

	/**
	 * 判定是否允许修改删除等操作
	 * @param flightDate
	 * @return
	 */
	boolean updateAbleCheck(Date flightDate);

	/**
	 * 对于某天的号位排班进行确认
	 * @param flightDate
	 */
	int confirm(Date flightDate,String dutyCode);
	
	/**
	 * 对自动排班的结果进行保存
	 * @param list
	 * @param dutyCode
	 * @return
	 */
	int saveAutoAssign(List<Position> list,String dutyCode);
	
	/**
	 * 根据机组几人制，返回初始的号位信息
	 * @param crewTypeId
	 * @return
	 */
	List<Position> listPositionByCrewType(int crewTypeId);
	
	/**
	 * 根据机组几人制+连线，初始化或者修改连线信息
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @param crewTypeId
	 */
	void initPositionByCrewType(String dutyCode,Date flightDate, Integer crewLinkLineNo,int crewTypeId);
	
	/**
	 * 根据连线号，计算该连线需要几人制
	 * @param dutyCode
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @return
	 */
	int buildCrewTypeIdByLinkLine(String dutyCode,Date flightDate, Integer crewLinkLineNo);
	
	/**
	 * 根据一堆已经有的号位，返回新的号位
	 * 规则：如果serialNoHaveList 为空，返回1
	 * 如果 serialNoHaveList 中间又空的，则返回第一个空的
	 * 如果中间没有空，则返回最大值+1
	 * @param serialNoHaveList
	 * @return
	 */
	int getNewSerialNo(List<Integer> serialNoHaveList);

	/**
	 * 判断某个航班的所有号位+飞行员 是否是双机长配置
	 * @param positonList
	 * @return
	 */
	boolean isDoubleCaption(List<Position> positonList);
	
	/**
	 * 判断某个航班的所有号位是否是两套组配置
	 * @param positonList
	 * @return
	 */
	boolean isDoubleGroup(List<Position> positonList);

	/**
	 * 根据日期初始化构造号位信息
	 * @param flightDateStart
	 * @param flightDateEnd
	 * @return
	 */
	ResponseResult<String> initPositon(String dutyCode,Date flightDateStart, Date flightDateEnd);
	
}
